package org.haifi.game.channel;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.haifi.game.AlertException;
import org.haifi.game.pb.GameCommonAction.AlertMessage;
import org.haifi.game.util.SessionUtils;

import com.google.protobuf.MessageLite;

/**
 * 具体处理指令的线程，会丢给线程池进行调度
 * 
 * 使用直接生成的动态类直接进行调用
 * 
 * @author joycube2
 * 
 */
public class GameProcesserActionRunnable extends GameProcesserRunnable {
	/**
	 * 要调用的action
	 */
	public GameCmdInvoker invoker;
	/**
	 * method的参数
	 */
	public MessageLite param;

	// 转移至GameProcessRunnable中
	// /**
	// * ioSession
	// */
	// public IoSession ioSession;

	@Override
	public void run() {
		if (log.isDebugEnabled()) {
			log.debug("process :" + ioSession);
		}
		try {
			// 这里的object怎么返回?
			// 答：可以直接返回，mina.encode会自动处理

			// TODO:这里需要验证下设置threadLocal是否会影响到性能
			// TODO:这里可以进行优化，在需要进行设置的地方才进行设置
			SessionUtils.setCurrentSession(ioSession);
			Object object = invoker.invokeAction(param);
			if (object != null) {
				ioSession.write(object);
			}
		} catch (AlertException exception) {
			// 返回异常
			log.error("ERROR", exception);
			AlertMessage.Builder message = AlertMessage.newBuilder().setInfo(
					exception.getMessage());
			ioSession.write(message);
		} catch (Exception exception) {
			log.error("ERROR", exception);
		}
	}

	private static final Log log = LogFactory
			.getLog(GameProcesserActionRunnable.class);
}
